package config

import (
	"fmt"
	"os"

	"gopkg.in/yaml.v3"
)

// Config 表示工具的完整配置
type Config struct {
	RootSync  RootSyncConfig  `yaml:"root_sync"`
	Blacklist []string        `yaml:"blacklist"`
	Policy    PolicyConfig    `yaml:"policy"`
	Audit     AuditConfig     `yaml:"audit"`
}

// RootSyncConfig 根证书同步配置
type RootSyncConfig struct {
	Enabled bool   `yaml:"enabled"`
	Source  string `yaml:"source"` // "wu" 或 "url"
	URL     string `yaml:"url"`
	SHA256  string `yaml:"sha256"`
}

// PolicyConfig 处理策略配置
type PolicyConfig struct {
	PreferIntermediate     bool `yaml:"prefer_intermediate"`
	ConfirmBeforeDisallow  bool `yaml:"confirm_before_disallow"`
}

// AuditConfig 审计和备份配置
type AuditConfig struct {
	BackupDir     string `yaml:"backup_dir"`
	LogDir        string `yaml:"log_dir"`
	RetentionDays int    `yaml:"retention_days"`
	LogLevel      string `yaml:"log_level"`
}

// Load 从 YAML 文件加载配置
func Load(path string) (*Config, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	var cfg Config
	if err := yaml.Unmarshal(data, &cfg); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %w", err)
	}

	if err := cfg.Validate(); err != nil {
		return nil, fmt.Errorf("配置验证失败: %w", err)
	}

	return &cfg, nil
}

// Validate 验证配置的有效性
func (c *Config) Validate() error {
	// 验证根同步源
	if c.RootSync.Enabled {
		if c.RootSync.Source != "wu" && c.RootSync.Source != "url" {
			return fmt.Errorf("无效的 root_sync.source: %s (必须是 'wu' 或 'url')", c.RootSync.Source)
		}
		if c.RootSync.Source == "url" && c.RootSync.URL == "" {
			return fmt.Errorf("当 root_sync.source 为 'url' 时，必须指定 root_sync.url")
		}
	}

	// 验证黑名单格式（SHA1 指纹，40位十六进制）
	for _, thumbprint := range c.Blacklist {
		if len(thumbprint) != 40 {
			return fmt.Errorf("无效的证书指纹长度: %s (必须是40位十六进制)", thumbprint)
		}
	}

	// 验证审计目录
	if c.Audit.BackupDir == "" {
		return fmt.Errorf("必须指定 audit.backup_dir")
	}
	if c.Audit.LogDir == "" {
		return fmt.Errorf("必须指定 audit.log_dir")
	}

	// 验证日志级别
	validLevels := map[string]bool{
		"debug": true,
		"info":  true,
		"warn":  true,
		"error": true,
	}
	if !validLevels[c.Audit.LogLevel] {
		return fmt.Errorf("无效的日志级别: %s (必须是 debug、info、warn 或 error)", c.Audit.LogLevel)
	}

	return nil
}
